package com.atguigu.gmall.product.controller;

import com.atguigu.gmall.common.result.Result;
import io.swagger.annotations.Api;
import org.apache.commons.io.FilenameUtils;
import org.csource.common.MyException;
import org.csource.fastdfs.ClientGlobal;
import org.csource.fastdfs.StorageClient1;
import org.csource.fastdfs.TrackerClient;
import org.csource.fastdfs.TrackerServer;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;

@Api(description = "fastDFS文件布式文件上传系统")
@RestController // @ResponseBody + @Controller
@RequestMapping("admin/product")
public class FileUploadController {

    /**
     * 分布式文件系统文件上传：必须要知道保存文件的服务器地址。
     * fastDFS分布式文件系统的 ip:port ===>>> http://192.168.200.128:8080/
     * 利用 @Value 标签可以引用application.yml中的值
     */
    @Value("${fileServer.url}")// 软编码：将可能会发生变化的数据写在配置文件中。
    private String fileUrl; // fileUrl = http://192.168.200.128:8080/ 该地址用于上传文件后回显用。

    /**
     * 文件上传的接口：http://api.gmall.com/admin/product/fileUpload
     *
     * @param file file的名字不能改变 与 后台管理系统页面对应
     * @return 返回上传后的图片路径（文件所在的路径）
     */
    @RequestMapping("fileUpload")
    public Result<String> fileUpload(MultipartFile file) throws IOException, MyException {

        // 1 读取配置文件 tracker.conf：获取上传文件使用的地址
        // 当文件在上传的时候，需要读取一个叫 tracker_server 的 key，获取上传的地址。tracker_server=192.168.200.128:22122
        String configFile = this.getClass().getResource("/tracker.conf").getFile();

        // 2 声明一个返回路径的变量
        String path = "";

        if (null != configFile) {
            // 3 初始化
            ClientGlobal.init(configFile);

            // 4 创建 trackerClient 用于获取文件上传后的位置{在storage中获取ip和端口}
            TrackerClient trackerClient = new TrackerClient();

            // 5 用 trackerClient 获取 trackerServer
            TrackerServer trackerServer = trackerClient.getConnection();

            // 6 创建 StorageClient1
            StorageClient1 storageClient1 = new StorageClient1(trackerServer, null);

            // 7 storageClient1 调用上传方法，返回一个文件所在的路径：用 path 去接收
            // 7.1 获取文件的后缀名
            String extension = FilenameUtils.getExtension(file.getOriginalFilename());

            // 7.2 调用上传方法
            // 第一个参数：当前上传文件的字节数组，第二个参数：文件后缀名 xxx.jpg
            path = storageClient1.upload_appender_file1(file.getBytes(), extension, null);

            // http://192.168.200.128:8080/xxx/xxx/xxx.jsp
            System.out.println("上传后返回的完整的文件路径" + fileUrl + path);
        }
        // 8 返回文件路径：需要拼接回显的地址
        return Result.ok(fileUrl + path);
    }
}
